草庐IT

C++ 链表行为

全部标签

c++ - 正在打印空指针未定义行为吗?

研究thisquestion的示例代码时我原以为是未定义的行为阻止了std::cout的后续使用打印。但事实证明attemptingtoprintanullpointercausedstd::ios_base::badbitandstd::ios_base::failbittobesetinitsstreamstate这是它无法运行的真正原因。因此,我现在很好奇它是否真的未定义行为(尝试)打印空指针。所以这是我的问题:打印空指针是未定义行为吗?如果是这样,导致这种情况的流插入器是什么?我很确定插入器足够聪明,不会取消引用空指针。我还想知道插入器为何在此上下文中遇到空指针时设置其错误掩码

c++ - printf 会导致未定义的行为吗?

这个问题在这里已经有了答案:Whydoesprintf("%f",0);giveundefinedbehavior?(10个答案)关闭6年前。intmain(){unsignedinti=12;printf("%lu",i);//Thisyieldsacompilerwarning}在32位平台上,使用printf和使用%lu的int会产生垃圾吗?

c++ - 这种未定义行为的基本原理是什么?

Warning[...]:undefinedbehavior:theorderofvolatileaccessesisundefinedinthisstatementx.cppxxx为什么这一行是未定义的行为?case2:Vdda=3.3*(*VREFINT_CAL)/ADC_DR->DATA;声明/初始化在哪里:volatileshortconst*VREFINT_CAL=(short*)0x1FFFF7BA;和volatileSTRUCT_ADC_DR*ADC_DR=(STRUCT_ADC_DR*)0x40012440;定义者:typedefstruct{unsignedDATA:

c++ - 为什么这两个右值引用示例具有不同的行为?

第一个例子inta=0;auto&&b=++a;++a;cout打印22第二个例子inta=0;auto&&b=a++;++a;cout打印20问题:为什么在第一个例子中第3行的++a也递增b,为什么在第二个例子中没有这样的行为?更新:Newquestion出现了。 最佳答案 因为pre-increment(++a)先自增a的值,存储结果,然后返回对的引用一个。现在a和b实际上指向同一个对象。后自增(a++),但是先把a的当前值存入一个临时的,自增a,然后返回thistemporary-你的右值ref指向的。a和b指向不同的对象,更

c++ - 有两个具有不同值的指针引用同一个对象是未定义的行为吗?

注意:如果在读完这个问题后您认为“这怎么可能发生”,那没关系。如果您想保持开放的心态,您可以遵循问题后的一些要点,这些要点说明了这是如何发生的以及为什么这样做有用。请记住,这只是一个问题,而不是关于这些主题的教程。这些评论已经有足够的噪音,而且很难跟上。如果您对这些主题有疑问,请将它们作为问题发布在SO而不是评论中,我将不胜感激。问题:如果我有一个int类型的对象存储在c指向的地址int*c=/*allocateint(returnsuniqueaddress)*/;*c=3;由两个指针a和b引用:int*a=/*createpointerto(*c)*/;int*b=/*create

c++ - "Return value optimization"会导致未定义的行为吗?

阅读this一位回复者指出的维基百科文章针对以下问题:C++Copyconstructor,temporariesandcopysemantics我遇到了这条线Dependingonthecompiler,andthecompiler'ssettings,theresultingprogrammaydisplayanyofthefollowingoutputs:这不符合未定义行为的条件吗?我知道这篇文章说Dependingonthecompilerandsettings但我只想清除它。 最佳答案 不,这不是未定义的行为。未定义的行为

c++ - 奇怪的 cout 行为

我在Ubuntu上编译了一个为Windows开发(并在Windows上运行)的程序。在Ubuntu上,我看到这段代码:strings=values_[9];cout产生这个输出:highxigh第二行的预期输出是“highx”。我知道values_[9]的值最初是从一个文件(写在Windows上)中读取的。打印其他字符串似乎工作正常。这是怎么回事? 最佳答案 运行命令,其输出通过cat-A进行管道传输。可能s的值,或者endl产生的输出给你一个'\r'字符,它通常将光标发回到行首。编辑:进一步思考,杂散的'\r'几乎肯定在s中,而不

c++ - 这个指针上的 const_cast 是未定义的行为吗?

在另一个问题中,我遇到了这段代码:RealStatData::mean(Realtrim)const{//trim,punnotintendedconst_cast(*this).items.sort();//trim}cppreference在他们的page上也有一个例子:structtype{type():i(3){}voidm1(intv)const{//this->i=v;//compileerror:thisisapointertoconstconst_cast(this)->i=v;//OK}inti;};除了为什么这会实用这一显而易见的问题之外,它不安全吗?创建的对象是否

c++ - 在 C++ 中检查数字是否为奇数。代码的奇怪行为

我是一名计算机科学助教,我的一个学生提交了以下代码来检查整数是奇数还是偶数:intis_odd(inti){if((i%2==1)&&(i%2==-1));else;}令人惊讶的是(至少对我而言)这段代码给出了正确的结果。我测试了高达100000000的数字,老实说,我无法解释为什么这段代码会这样运行。我们正在使用gccv6.2.1和c++我知道这不是一个典型的问题,但我希望能找到一些帮助。 最佳答案 无论您的编译器实际发生了什么,在不返回任何内容的情况下从函数末尾流出是未定义的行为。请注意,如果您将-O3传递给GCC,或使用Cla

C++按排序顺序添加到链表

您好,我有一个使用结构的链表。现在我得到它在最后添加每个元素。但是我想根据ID按排序顺序添加每个元素。该结构有两个元素:字符串名称和长ID。node*temp=newnode;temp->name=nameRead;temp->id=idRead;//checkiffirstitem,ifsoaddasheadif(head==NULL){head=temp;}else{node*temp2=head;while(temp2->next!=NULL){temp2=temp2->next;}temp2->next=temp;} 最佳答案